In [4]:
import plotly.graph_objects as go
import numpy as np
import pandas as pd

# load in the hierarchy information
multilevel_lookup = pd.read_csv("https://raw.githubusercontent.com/bcaffo/MRIcloudT1volumetrics/master/inst/extdata/multilevel_lookup_table.txt", sep="\t").drop(['Level5'], axis=1)
multilevel_lookup = multilevel_lookup.rename(columns={
    "modify": "roi",
    "modify.1": "level4",
    "modify.2": "level3",
    "modify.3": "level2",
    "modify.4": "level1"})
multilevel_lookup = multilevel_lookup[['roi', 'level4', 'level3', 'level2', 'level1']]
print(multilevel_lookup.head())

# Now load in the subject data
id = 127
subjectData = pd.read_csv("https://raw.githubusercontent.com/smart-stats/ds4bio_book/main/book/assetts/kirby21AllLevels.csv")
print(subjectData.head())
          roi level4     level3            level2           level1
0       SFG_L  SFG_L  Frontal_L  CerebralCortex_L  Telencephalon_L
1       SFG_R  SFG_R  Frontal_R  CerebralCortex_R  Telencephalon_R
2   SFG_PFC_L  SFG_L  Frontal_L  CerebralCortex_L  Telencephalon_L
3   SFG_PFC_R  SFG_R  Frontal_R  CerebralCortex_R  Telencephalon_R
4  SFG_pole_L  SFG_L  Frontal_L  CerebralCortex_L  Telencephalon_L
   Unnamed: 0                 rawid              roi  volume   min    max  \
0           1  kirby127a_3_1_ax.img  Telencephalon_L  531111   0.0  374.0   
1           2  kirby127a_3_1_ax.img  Telencephalon_R  543404   0.0  300.0   
2           3  kirby127a_3_1_ax.img   Diencephalon_L    9683  15.0  295.0   
3           4  kirby127a_3_1_ax.img   Diencephalon_R    9678  10.0  335.0   
4           5  kirby127a_3_1_ax.img    Mesencephalon   10268  55.0  307.0   

       mean      std  type  level   id      icv      tbv  
0  128.3013  51.8593     1      1  127  1378295  1268519  
1  135.0683  53.6471     1      1  127  1378295  1268519  
2  193.5488  32.2733     1      1  127  1378295  1268519  
3  193.7051  32.7869     1      1  127  1378295  1268519  
4  230.8583  29.2249     1      1  127  1378295  1268519  
In [5]:
subjectData = subjectData.loc[(subjectData.type == 1) & (subjectData.level == 5) & (subjectData.id == id)]
subjectData = subjectData[['roi', 'volume']]

## Merge the subject data with the multilevel data
subjectData = pd.merge(subjectData, multilevel_lookup, on="roi")
subjectData = subjectData.assign(icv="ICV")
subjectData = subjectData.assign(comp=subjectData.volume / np.sum(subjectData.volume))

# prepare data for sankey diagram
labels = np.append(subjectData['roi'].unique(), subjectData['level1'].unique())
label_indexes = {k: v for v, k in enumerate(labels)}
subjectData = subjectData.replace({'roi': label_indexes})
subjectData = subjectData.replace({'level1': label_indexes})
print(subjectData.head())

fig = go.Figure(data=[go.Sankey(
    valueformat=".0f",
    valuesuffix="TWh",
    # Define nodes
    node=dict(
        pad=15,
        thickness=15,
        line=dict(color="black", width=0.5),
        label=labels
    ),
    # Add links
    link=dict(
        source=subjectData['roi'],
        target=subjectData['level1'],
        value=subjectData['volume']
    ))])

fig.update_layout(title_text="Test",
                  font_size=10)

#fig.write_html("sankey.html")
fig.show()
   roi  volume level4     level3            level2  level1  icv      comp
0    0   12926  SFG_L  Frontal_L  CerebralCortex_L     274  ICV  0.009350
1    1   10050  SFG_R  Frontal_R  CerebralCortex_R     275  ICV  0.007270
2    2   12783  SFG_L  Frontal_L  CerebralCortex_L     274  ICV  0.009247
3    3   11507  SFG_R  Frontal_R  CerebralCortex_R     275  ICV  0.008324
4    4    3078  SFG_L  Frontal_L  CerebralCortex_L     274  ICV  0.002227
In [11]:
import plotly.graph_objects as go
import numpy as np
import pandas as pd

# load in the hierarchy information
multilevel_lookup = pd.read_csv("https://raw.githubusercontent.com/bcaffo/MRIcloudT1volumetrics/master/inst/extdata/multilevel_lookup_table.txt", sep="\t").drop(['Level5'], axis=1)
multilevel_lookup = multilevel_lookup.rename(columns={
    "modify": "roi",
    "modify.1": "level4",
    "modify.2": "level3",
    "modify.3": "level2",
    "modify.4": "level1"})
multilevel_lookup = multilevel_lookup[['roi', 'level4', 'level3', 'level2', 'level1']]
# print(multilevel_lookup.head())

# Now load in the subject data
id = 127
subjectData = pd.read_csv("https://raw.githubusercontent.com/smart-stats/ds4bio_book/main/book/assetts/kirby21AllLevels.csv")
subjectData = subjectData.loc[(subjectData.type == 1) & (subjectData.level == 5) & (subjectData.id == id)]
subjectData = subjectData[['roi', 'volume']]

## Merge the subject data with the multilevel data
subjectData = pd.merge(subjectData, multilevel_lookup, on="roi")
subjectData = subjectData.assign(icv="ICV")
subjectData = subjectData.assign(comp=subjectData.volume / np.sum(subjectData.volume))

# prepare data for sankey diagram
sankeyData = pd.DataFrame(columns=['source', 'target', 'comp'])
columns = ['icv', 'level1', 'level2']

for s in range(len(columns)):
    for t in range(s + 1, len(columns)):
        sankeyData = sankeyData.append(subjectData[[columns[s], columns[t], 'comp']] \
                                       .groupby([columns[s], columns[t]]).mean().reset_index() \
                                       .rename(columns={columns[s]: 'source', columns[t]: 'target'}))

labels = np.array(['ICV'])
for c in columns[1:]:
    labels = np.append(labels, subjectData[c].unique())

# label => index map
label_indexes = {k: v for v, k in enumerate(labels)}
# replace labels with indexes
sankeyData = sankeyData.replace({'source': label_indexes})
sankeyData = sankeyData.replace({'target': label_indexes})
print(sankeyData.head())

fig = go.Figure(data=[go.Sankey(
    valueformat=".0f",
    # Define nodes
    node=dict(
        pad=15,
        thickness=15,
        line=dict(color="black", width=0.5),
        label=labels
    ),
    # Add links
    link=dict(
        source=sankeyData['source'],
        target=sankeyData['target'],
        value=sankeyData['comp']
    ))])

fig.update_layout(title_text="Sankey Diagram",
                  font_size=10)

fig.write_html("sankey.html")
fig.show()
   source  target      comp
0       0       8  0.002482
1       0       3  0.001069
2       0       4  0.001045
3       0       5  0.000929
4       0       6  0.005766
/var/folders/ks/9bt48sw176x42y_3jfv52tx00000gn/T/ipykernel_55114/3293489617.py:33: FutureWarning:

The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.

/var/folders/ks/9bt48sw176x42y_3jfv52tx00000gn/T/ipykernel_55114/3293489617.py:33: FutureWarning:

The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.

/var/folders/ks/9bt48sw176x42y_3jfv52tx00000gn/T/ipykernel_55114/3293489617.py:33: FutureWarning:

The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.

In [ ]: